import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image


def histogram_equalization(image_path):
    # 读取彩色图像
    img = Image.open(image_path).convert("RGB")
    img.show()
    if img is None:
        raise ValueError("图像路径错误或图像无法读取")
    # 转换到HSV颜色空间
    hsv_img = img.convert("HSV")
    #hsv_img.show()
    h, s, v = hsv_img.split()
    # 将V通道（亮度）转换为NumPy数组进行处理
    v_array = np.array(v)
    # 计算V通道的直方图
    hist, bins = np.histogram(v_array.flatten(), 256, [0, 256])
    # 计算累积分布函数（CDF）
    cdf = hist.cumsum()
    cdf_normalized = cdf * hist.max() / cdf.max()  # 归一化CDF（仅用于绘图）
    # 直方图均衡化映射
    cdf_m = np.ma.masked_equal(cdf, 0)  # 避免除以零
    cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min())
    cdf = np.ma.filled(cdf_m, 0).astype('uint8')
    # 应用映射到V通道
    v_eq_array = cdf[v_array]
    v_eq = Image.fromarray(v_eq_array)
    # 合并处理后的V通道与原始H、S通道
    hsv_eq = Image.merge("HSV", (h, s, v_eq))
    # 转回RGB空间
    rgb_eq = hsv_eq.convert("RGB")
    rgb_eq.show()
    # 显示原始图像和处理后的图像
    plt.figure(figsize=(12, 6))
    # 原始图像
    plt.subplot(2, 2, 1)
    plt.imshow(img)
    plt.title('Original Image')
    plt.axis('off')
    # 原始V通道直方图
    plt.subplot(2, 2, 2)
    plt.plot(hist, color='black')
    plt.plot(cdf_normalized, color='red')
    plt.title('Original V Channel Histogram (CDF in Red)')
    plt.xlim([0, 256])
    # 处理后的图像
    plt.subplot(2, 2, 3)
    plt.imshow(rgb_eq)
    plt.title('Equalized Image (HSV)')
    plt.axis('off')
    # 处理后的V通道直方图
    plt.subplot(2, 2, 4)
    hist_eq, _ = np.histogram(v_eq_array.flatten(), 256, [0, 256])
    plt.plot(hist_eq, color='black')
    plt.title('Equalized V Channel Histogram')
    plt.xlim([0, 256])
    plt.tight_layout()
    #plt.show()
    return rgb_eq
# 使用示例
histogram_equalization('D:\jvnhenghua\\test.jpg')  # 替换为你的图像路径